#include <iostream>
#include <unistd.h>
#include <pthread.h>
#include <cstdio>
#include <cerrno>
#include <string>
#include <thread>

using namespace std;

//如果多线程访问同一个全局变量，并对他进行计算，
int tickets = 10000;

void* getTickets(void* args)
{
    (void)args;
    while (true)
    {
        if (tickets > 0)
        {
            usleep(1000);
            printf("%p : %d\n", pthread_self(), tickets);
            --tickets;
        }
    }
}

int main()
{
    pthread_t t1, t2, t3;
    //多线程抢票的逻辑
    pthread_create(&t1, nullptr, getTickets, nullptr);
    pthread_create(&t2, nullptr, getTickets, nullptr);
    pthread_create(&t3, nullptr, getTickets, nullptr);

    pthread_join(t1, nullptr);
    pthread_join(t2, nullptr);
    pthread_join(t3, nullptr);

    return 0;
}

// void fun()
// {
//     while (true)
//     {
//         cout << "" << endl;
//         sleep(1); 
//     }
// }

// int main()
// {
//     thread t(fun);
//     return 0;
// }


// //修饰全局变量，带来的结果就是让每一个线程各自拥有一个全局变量 -- 线程的局部存储
// __thread int g_val = 0;

// //1.线程谁先运行与调度器相关
// //2.线程一旦异常，都可能导致整个进程整体退出
// //3.线程输入和返回值的问题
// //4.线程异常退出
// void* threadRoutine(void* args)
// {
//     pthread_detach(pthread_self());

//     while (true)
//     {
//         cout << (char*)args << " : " << g_val << " & : " << &g_val << endl;
//         ++g_val;
//         sleep(1);
//         break;
//     }
//     pthread_exit((void*)11);

//     // int i = 0;
//     // int* data = new int[10];
//     // while (true)
//     // {
//     //     cout << "新线程 : " << (char*)args << " running ..." << pthread_self() << endl;
//     //     sleep(1);
//     //     data[i] = i;
//     //     if (i++ == 10) break;
//     // }
//     // cout << "new thread quit" << endl;
//     // //pthread_exit((void*)13);//线程退出
//     // return (void*)data;//返回给pthread_join
// }

// int main()
// {
//     pthread_t tid;//本质上是一个地址
//     pthread_create(&tid, nullptr, threadRoutine, (void*)"thread 1");

//     while (true)
//     {
//         cout << "main thread" << " : " << g_val << " & : " << &g_val << endl;
//         sleep(1);
//         break;
//     }
//     int n = pthread_join(tid, nullptr);
//     cout << "n : " << n << " errstring : " << strerror(n) << endl;


//     // printf("%lu, %p\n", tid, tid);

//     // int* ret = nullptr;

//     // pthread_cancel(tid);//返回值为PTHREAD_CANCELD 就是-1

//     // pthread_join(tid, (void**)&ret);//默认会阻塞等待新线程退出

//     // cout << "main thread wait done ... main quit ... : new thread quit : " <<  endl;

//     // for (int i = 0; i < 10; i++)
//     // {
//     //     cout << ret[i] << " ";
//     // }
//     // cout << endl;
//     // //3.线程在创建并执行的时候，线程也是需要等待的，如果主程如果不等待
//     // //即会引起僵尸进程的问题，导致内存泄露
//     // // while (true)
//     // // {
//     // //     cout << "main线程 : " << " running ..." << endl;
//     // //     sleep(1);
//     // // }

//     return 0;
// }